home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 201-225 / disk_217 / snipit / detach.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  2KB  |  106 lines

  1. /* Copyright (C) 1986,1987 by Manx Software Systems, Inc. */
  2.  
  3. /* Hacked up for SnipIt 1.2 use - Scott Evernden */
  4.  
  5. #include <exec/memory.h>
  6. #include <libraries/dosextens.h>
  7. #include <functions.h>
  8.  
  9. struct Process *_FindTask();
  10. void *_AllocMem();
  11. long _Open();
  12.  
  13. #define STACK_SIZE    3000L
  14.  
  15. extern BPTR output;
  16. extern long running;
  17.  
  18. extern char *_procname;
  19. extern char *_detach_name;
  20. static long _alen = 0;
  21. static char *_aptr = 0;
  22.  
  23. #asm
  24.     dseg
  25.     public    __savsp
  26.     cseg
  27. #endasm
  28.  
  29. do_detach(alen, aptr)
  30. long *alen;
  31. char **aptr;
  32. {
  33.     register struct CommandLineInterface *cli;
  34.     register struct Process *pp;
  35.     register unsigned short c;
  36.     register char *cp;
  37.     register long l;
  38.     long *lp, *sav;
  39.     struct MemList *mm;
  40.  
  41.     pp = _FindTask(0L);
  42.  
  43.     /* first time through!! */
  44.     if (pp->pr_CLI) {
  45.  
  46.         cli = (struct CommandLineInterface *) ((long)pp->pr_CLI << 2);
  47.         l = cli->cli_Module;
  48.  
  49.         output = (BPTR) _Open("*", MODE_OLDFILE);
  50.  
  51.         _alen = *alen;
  52.         _aptr = _AllocMem(_alen, 0L);
  53.         movmem(*aptr, _aptr, (int)_alen);
  54.  
  55.         cp = (char *)((long)cli->cli_CommandName << 2);
  56.         _detach_name = AllocMem((long)cp[0]+1, 0L);
  57.         movmem(cp, _detach_name, cp[0]+1);
  58. #asm
  59.         move.l    __savsp,-(sp)
  60. #endasm
  61.         cli->cli_Module = 0;
  62.         CreateProc(_procname, 0L, l, STACK_SIZE);
  63.         while (running == 0)
  64.             Delay(5L);
  65. #asm
  66.         move.l    (sp)+,sp
  67.         move.l    #0,d0
  68.         rts
  69. #endasm
  70.     }
  71.  
  72.     /* second time through */
  73.     else if (strcmp(pp->pr_Task.tc_Node.ln_Name, _procname) == 0) {
  74.  
  75.         lp = (long *)((long)pp->pr_SegList << 2);
  76.         lp = (long *)(lp[3] << 2);
  77.         sav = lp;
  78.         c = 2;
  79.         while (lp) {
  80.             lp = (long *)(*lp << 2);
  81.             c++;
  82.         }
  83.         mm = _AllocMem((long)sizeof(struct MemList)+
  84.                             (c-1)*sizeof(struct MemEntry), 0L);
  85.         lp = sav;
  86.         mm->ml_NumEntries = c;
  87.         c = 0;
  88.         while (lp) {
  89.             mm->ml_me[c].me_Addr = (APTR)lp - 1;
  90.             mm->ml_me[c].me_Length = lp[-1];
  91.             lp = (long *)(*lp << 2);
  92.             c++;
  93.         }
  94.         mm->ml_me[c].me_Addr = (APTR)_aptr;
  95.         mm->ml_me[c++].me_Length = _alen;
  96.         mm->ml_me[c].me_Addr = (APTR)_detach_name;
  97.         mm->ml_me[c++].me_Length = _detach_name[0] + 1;
  98.  
  99.         AddTail(&((struct Task *)pp)->tc_MemEntry, mm);
  100.  
  101.         *alen = _alen;
  102.         *aptr = _aptr;
  103.     }
  104. }
  105.  
  106.